package com.sdc.servlets;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;

import com.sdc.bean.UsuarioBean;
import com.sdc.control.ControleUsuario;

/**
 * Servlet implementation class Acesso
 */
public class AcessoServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private static final Logger log = Logger.getLogger(AcessoServlet.class);
	private HttpSession session = null;
	private RequestDispatcher dispatcher = null;
	private UsuarioBean usuario = null;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public AcessoServlet() {
		super();
	}

	/**
	 * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void service(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		// recupera a session
		HttpSession session = request.getSession();
		log.debug("Sessão recuperada");

		// // recupera os cookies
		Cookie[] cookies = request.getCookies();
		Cookie myCookie = null;
		for (int i = 0; i < cookies.length; i++) {
			if (cookies[i].getName().equalsIgnoreCase("strUsuario")) {
				myCookie = cookies[i];
			}
		}

		//
		// // recupera a action
		String action = request.getParameter("action");
		log.debug("Action capturada: " + action);

		if (action != null) {

			if (action.equalsIgnoreCase("autenticar")) {
				ControleUsuario cu = new ControleUsuario();

				if (session.getAttribute("usuario") != null) {

					UsuarioBean	usuario = (UsuarioBean) session.getAttribute("usuario");
					if (usuario.isLogado()) {
						log.debug("Usuário ja logado redirecionando");
						return;
					}

				}
				String nome_usuario = request.getParameter("strUsuario");
				String senha = request.getParameter("strSenha");

				if (nome_usuario == null || senha == null) {

					request.setAttribute("erros",
							"Usuário não encontrado ou senha inválida");
					dispatcher = request.getRequestDispatcher("/error.jsf");
					return;
				}

				UsuarioBean	usuario = cu.autenticar(new UsuarioBean(nome_usuario, senha),
						session.getId());

				if (usuario != null) {
					for (int i = 0; i < cookies.length; i++) {
						if (cookies[i].getName().equalsIgnoreCase("usuario")) {
							Cookie meu_cookie = new Cookie("usuario", usuario
									.getNome());

						}
					}

					myCookie = new Cookie("strUsuario", usuario.getUsuario());
					myCookie.setMaxAge(10 * 60);
					response.addCookie(myCookie);

					// // seta session para ficar ativa por 5 minutos
					session.setMaxInactiveInterval(10 * 60);
					usuario.setLogado(true);
					session.setAttribute("usuario", usuario);
					session.setAttribute("tipo_usuario", usuario
							.getId_tipo_usuario());

					if (session.getAttribute("passo") != null) {

						if (session.getAttribute("passo").toString()
								.equalsIgnoreCase("finalizar_compra")) {
							response
									.sendRedirect("jsp/sistema/compras/formas_pagamento.jsf");
						}
					} else {
						response.sendRedirect("principal.jsf");
					}

				} else {

					request.setAttribute("erros",
							"Usuário inativo, contacte administrador");
					dispatcher = request.getRequestDispatcher("/error.jsf");

					request.setAttribute("erros",
							"Usuário não encontrado ou senha inválida");
					dispatcher = request.getRequestDispatcher("/error.jsf");
				}
			}

			if (action.equalsIgnoreCase("deslogar")) {
				if (session.getAttribute("usuario") == null) {
					dispatcher = request.getRequestDispatcher("logout.jsf");
				} else {
					usuario = (UsuarioBean) session.getAttribute("usuario");
					usuario.setLogado(false);

					ControleUsuario cu = new ControleUsuario();
					cu.deslogar(usuario, session.getId(), request
							.getRemoteAddr());

					log
							.debug("usuario [" + usuario.getUsuario()
									+ "]deslogado");
					session.removeAttribute("usuario");
					session.setAttribute("usuario", null);
					session.invalidate();
				}
			}

		} else {
			if (usuario != null) {

				if (usuario.isLogado()) {
					response.sendRedirect("principal.jsf");

				} else {
					response.sendRedirect("index.jsf");
				}
			}

		}
		if (!response.isCommitted()) {
			try {
				if (!response.isCommitted()) {
					dispatcher.forward(request, response);
				}
			} catch (Exception e) {
				dispatcher = request.getRequestDispatcher("index.jsf");
				dispatcher.forward(request, response);
			}

		}

	}
}
